package org.alesv.entranceExams.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.alesv.common.logging.annotations.LogDebug;
import org.alesv.entranceExams.Config;
import org.alesv.entranceExams.model.UserProfile;
import org.alesv.entranceExams.service.LoginService;
import org.alesv.entranceExams.web.UrlConstants;
import org.alesv.entranceExams.web.form.LoginForm;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 * Controlador que se encarga de realizar la autenticación del usuario y obtener
 * la información que se mostrará en la página principal.
 */
@Controller
public class LoginController extends GameOfGhostBaseController {

	private final Logger log = LoggerFactory.getLogger(LoginController.class);

	@Autowired
	private LoginService loginService;

	/**
	 * Acceso al fichero de configuración de la aplicación.
	 */
	@Autowired
	private Config config;

	/**
	 * Método que únicamente redirecciona a la página principal.
	 * 
	 * @return Nombre de la vista que se mostrará cuando termine la ejecución.
	 */
	@RequestMapping(UrlConstants.URL_INDEX)
	@LogDebug(loggerClass = LoginController.class)
	public String index() {
		return redirect(UrlConstants.URL_LETSPLAY);
	}

	/**
	 * Se encarga de recibir la petición de autenticación y, en caso de éxito,
	 * redirigir a la pantalla principal.
	 * 
	 * @param form
	 *            Datos del formulario de autenticación.
	 * @param model
	 *            Contenedor de atributos que se pasará a la vista.
	 * @param session
	 *            session.
	 * @param request
	 *            request.
	 * @return Nombre de la vista que se mostrará cuando termine la ejecución.
	 */
	@RequestMapping(UrlConstants.URL_LOGIN)
	public String login(Model model, LoginForm form, HttpSession session,
			HttpServletRequest request) {
		// String resultView = redirect(UrlConstants.URL_MAIN); TODO hecho para
		// probar las rutas.
		String resultView = redirect(UrlConstants.URL_LETSPLAY);

		// Validamos que el formulario no venga vacio

		if (StringUtils.isEmpty(form.getUsername())
				&& StringUtils.isEmpty(form.getPassword())) {
			LoginForm loginForm = new LoginForm();

			loginForm
					.setUsername(getMessage("login.input.username.defaultValue"));
			loginForm
					.setPassword(getMessage("login.input.password.defaultValue"));

			model.addAttribute(UrlConstants.PARAM_LOGIN_FORM, loginForm);

			model.addAttribute("usernameDefaultValue",
					getMessage("login.input.username.defaultValue"));
			model.addAttribute("passwordDefaultValue",
					getMessage("login.input.password.defaultValue"));

			resultView = UrlConstants.VIEW_LOGIN;
			return resultView;
		}

		UserProfile userProfile = loginService.logIn(form.getUsername(),
				form.getPassword());

		if (userProfile != null) {
			setSessionAttribute(session, UrlConstants.PARAM_USER_PROFILE,
					userProfile);
		} else {
			LoginForm loginForm = new LoginForm();
			loginForm.setUsername(form.getUsername());
			loginForm.setPassword("");

			model.addAttribute(UrlConstants.PARAM_LOGIN_FORM, loginForm);
			model.addAttribute(UrlConstants.PARAM_ERROR_MESSAGE,
					"Incorrect user/password"); // TODO do it with a constant.

			model.addAttribute("usernameDefaultValue",
					getMessage("login.input.username.defaultValue"));
			model.addAttribute("passwordDefaultValue",
					getMessage("login.input.password.defaultValue"));

			resultView = UrlConstants.VIEW_LOGIN;
		}

		resultView = redirect(UrlConstants.URL_LETSPLAY);

		return resultView;
	}

	@RequestMapping(UrlConstants.URL_LOGOUT)
	public String logout(Model model, HttpSession session) {
		UserProfile userProfile = (UserProfile) getSessionAttribute(session,
				UrlConstants.PARAM_USER_PROFILE);

		loginService.logOut(userProfile.getUser());

		clearSession(session);
		SecurityContextHolder.clearContext();
		return redirect(UrlConstants.URL_LOGIN);
	}

}
